﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Npgsql;
using Ortodoctor.Componentes;
using System.Data;

namespace Ortodoctor.modelo
{
    public class modeloCredito : conexao
    {
        public modeloCredito()
        {
            conn = new NpgsqlConnection(connectionstring);
            conn.Open();
        }

        public void insert(int credito, int id_cliente)
        {
            try
            {
                ////con.open();
                String sql = "INSERT INTO creditos(credito, id_cliente, data_credito) VALUES (:p1, :p2, :p3)";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p1", credito);
                com.Parameters.AddWithValue("p2", id_cliente);
                com.Parameters.AddWithValue("p3", DateTime.Now.ToString("dd/MM/yyyy"));
                com.ExecuteNonQuery();
            }
            catch (Exception ex) {

                conn.Open();
                String sql = "INSERT INTO creditos(credito, id_cliente, data_credito) VALUES (:p1, :p2, :p3)";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p1", credito);
                com.Parameters.AddWithValue("p2", id_cliente);
                com.Parameters.AddWithValue("p3", DateTime.Now.ToString("dd/MM/yyyy"));
                com.ExecuteNonQuery();
            
            }
            finally
            {
                conn.Close();
            }
        }

        public string getDate(int id_cliente)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT data_credito FROM creditos where id_cliente=" + id_cliente;
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            if(dt == null || dt.Rows.Count == 0)
                return "";

            return Convert.ToDateTime(dt.Rows[0]["data_credito"]).ToString("dd/MM/yyyy");
        }

        public int getCredito(int id_cliente)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT (credito - debito) as credito FROM creditos where id_cliente=" + id_cliente;
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            if (dt == null || dt.Rows.Count == 0)
                return -1;

            return Convert.ToInt32(dt.Rows[0]["credito"]);
        }

        internal void credita(int credito, int id_cliente)
        {
            credito = credito < 0 ? 0 : credito;
            try
            {
                string date = getDate(id_cliente);
                if (date.Equals(""))
                {
                    insert(credito, id_cliente);
                }
                else if (Convert.ToInt32(date.Split('/')[1]) + Convert.ToInt32(date.Split('/')[2]) * 12 <= DateTime.Now.Year * 12 + DateTime.Now.Month)
                {
                    //con.open();
                    String sql = "update creditos set credito=:p1, data_credito=:p2, id_usuario_modificacao=:p4 where id_cliente = :p3";
                    NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                    com.Parameters.AddWithValue("p1", credito);
                    com.Parameters.AddWithValue("p2", DateTime.Now.ToString("dd/MM/yyyy"));
                    com.Parameters.AddWithValue("p3", id_cliente);
                    com.Parameters.AddWithValue("p4", HttpContext.Current.Session["ID_USUARIO_ACESSO"] == null ?
                                                     "-1" : HttpContext.Current.Session["ID_USUARIO_ACESSO"].ToString());
                    com.ExecuteNonQuery();
                }
            }
            catch (Exception ex) {
                string date = getDate(id_cliente);
                if (date.Equals(""))
                {
                    insert(credito, id_cliente);
                }
                else if (Convert.ToInt32(date.Split('/')[1]) + Convert.ToInt32(date.Split('/')[2]) * 12 <= DateTime.Now.Year * 12 + DateTime.Now.Month)
                {
                    conn.Open();
                    String sql = "update creditos set credito=:p1, data_credito=:p2, id_usuario_modificacao=:p4 where id_cliente = :p3";
                    NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                    com.Parameters.AddWithValue("p1", credito);
                    com.Parameters.AddWithValue("p2", DateTime.Now.ToString("dd/MM/yyyy"));
                    com.Parameters.AddWithValue("p3", id_cliente);
                    com.Parameters.AddWithValue("p4", HttpContext.Current.Session["ID_USUARIO_ACESSO"] == null ?
                                                     "-1" : HttpContext.Current.Session["ID_USUARIO_ACESSO"].ToString());
                    com.ExecuteNonQuery();
                }
            }
            finally
            {
                conn.Close();
            }
        }

        internal void debita(int debito, int id_cliente)
        {
            int debitar = getDebito(id_cliente);
            try
            {
                conn.Open();
                String sql = "update creditos set debito=:p1, data_credito=:p2, id_usuario_modificacao=:p4 where id_cliente = :p3";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p1", debitar + debito);
                com.Parameters.AddWithValue("p2", DateTime.Now.ToString("dd/MM/yyyy"));
                com.Parameters.AddWithValue("p3", id_cliente);
                com.Parameters.AddWithValue("p4", HttpContext.Current.Session["ID_USUARIO_ACESSO"].ToString());
                com.ExecuteNonQuery();
            }
            catch
            {
                String sql = "update creditos set debito=:p1, data_credito=:p2, id_usuario_modificacao=:p4 where id_cliente = :p3";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p1", debitar + debito);
                com.Parameters.AddWithValue("p2", DateTime.Now.ToString("dd/MM/yyyy"));
                com.Parameters.AddWithValue("p3", id_cliente);
                com.Parameters.AddWithValue("p4", HttpContext.Current.Session["ID_USUARIO_ACESSO"].ToString());
                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }

        internal int getDebito(int id_cliente)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "select (debito) as saldo from creditos where id_cliente=" + id_cliente;
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            catch (Exception ex) { }
            finally
            {
                conn.Close();
            }

            if (dt == null || dt.Rows.Count == 0)
                return 0;
            else
                return Convert.ToInt32(dt.Rows[0]["saldo"]);
        }

        internal bool getSaldoSoma(int id_cliente)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = @"select status from parcelas 
                                            inner join procedimento_cliente using(id_procedimento_cliente) 
                                where id_cliente = " + id_cliente + " order by data_vencimento limit(1)";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            catch (Exception ex) { }
            finally
            {
                conn.Close();
            }

            if (dt == null || dt.Rows.Count == 0)
                return false;
            else
            {
                dt.DefaultView.RowFilter = "[status] like '%PAGO%'";
                return dt.DefaultView.ToTable().Rows.Count == 1 ? true : false;
            }
        }

//        internal DataTable getCreditosPeriodo(int id_cliente, int id_clinica, string datainicial, string datafinal)
//        {
//            DataTable dt = new DataTable();
            
//            string str = "";
//            if (id_cliente == -999)
//            {
//                try
//                {
//                    //con.open();
//                    String sql = "SELECT ID_CLIENTE FROM CLIENTE " +
//                        (string.IsNullOrEmpty(datainicial) ? "" : string.Format("WHERE DATA_CADASTRO BETWEEN '{1}' AND '{1}'",
//                                    Convert.ToDateTime(datainicial).ToString("MM/dd/yyyy"),
//                                    Convert.ToDateTime(datafinal).ToString("MM/dd/yyyy"))) +
//                                    (string.IsNullOrEmpty(datainicial) ? " WHERE " : " AND ") +
//                                    " (ID_CLINICA = " + id_clinica + " OR -999 = " + id_clinica + ")";
//                    NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
//                    da.Fill(dt);
//                }
//                catch (Exception ex) { }
//                finally
//                {
//                    conn.Close();
//                }
//                foreach (DataRow dr in dt.Rows)
//                    str += (string.IsNullOrEmpty(str) ? "" : ",") + dr["ID_CLIENTE"].ToString();
//            }
//            try
//            {
//                dt = new DataTable();
//                //con.open();
//                str = string.IsNullOrEmpty(str) ? id_cliente.ToString() : str;
//                String sql = @"
//                            SELECT  CLIENTE.NOME AS ""Paciente"", 
//	                            CREDITOS.CREDITO AS ""Creditos"", 
//	                            COUNT(INDICADO.*) AS ""Nro Indicados"",
//	                            COUNT(PROCEDIMENTO_CLIENTE.*) AS ""Nro Trat. Ind.""
//                            FROM CLIENTE 
//                                           INNER JOIN CREDITOS USING(ID_CLIENTE)
//                                           INNER JOIN INDICADO ON CLIENTE.ID_CLIENTE = INDICADO.ID_CLIENTE_INDICOU
//                                           LEFT JOIN PROCEDIMENTO_CLIENTE ON PROCEDIMENTO_CLIENTE.ID_CLIENTE = INDICADO.ID_CLIENTE_INDICADO
//                            WHERE CLIENTE.ID_CLIENTE IN (" + str + ") GROUP BY NOME, CREDITO";
                    
//                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
//                da.Fill(dt);
//            }
//            catch (Exception ex) { }
//            finally
//            {
//                conn.Close();
//            }
//            return dt;
//        }

        internal DataTable getCreditosPeriodo(int id_cliente, int id_clinica, string datainicial, string datafinal)
        {
            DataTable dt = new DataTable();

            string str = "";
            //select c.id_cliente, cl.nome as Paciente, array_to_string(array(select cliente.nome from indicado inner join cliente on (id_cliente = id_cliente_indicado) where id_cliente_indicou = c.id_cliente), ', ') as Indicados, c.credito as Credito, c.debito as Debitado, credito - debito as Total from creditos as c inner join indicado on (id_cliente_indicou = c.id_cliente) inner join cliente as cl using (id_cliente) where c.credito > 0 group by cl.nome, c.id_cliente, c.credito, c.debito order by credito desc
            try
            {
                dt = new DataTable();
                //con.open();
                str = string.IsNullOrEmpty(str) ? id_cliente.ToString() : str;
//                String sql = @"
//                            SELECT  CLIENTE.NOME AS ""Paciente"", 
//	                            CREDITOS.CREDITO AS ""Creditos"", 
//	                            COUNT(INDICADO.*) AS ""Nro Indicados"",
//	                            COUNT(PROCEDIMENTO_CLIENTE.*) AS ""Nro Trat. Ind.""
//                            FROM CLIENTE 
//                                           INNER JOIN CREDITOS USING(ID_CLIENTE)
//                                           INNER JOIN INDICADO ON CLIENTE.ID_CLIENTE = INDICADO.ID_CLIENTE_INDICOU
//                                           LEFT JOIN PROCEDIMENTO_CLIENTE ON PROCEDIMENTO_CLIENTE.ID_CLIENTE = INDICADO.ID_CLIENTE_INDICADO
//                            WHERE CLIENTE.ID_CLIENTE IN (" + str + ") GROUP BY NOME, CREDITO";

                String sql = string.Format(@"select cl.nome as ""Paciente"", 
                                array_to_string(array(select cliente.nome from indicado inner join cliente on (id_cliente = id_cliente_indicado) where id_cliente_indicou = c.id_cliente), ', ') as ""Indicados"", 
                                c.credito as ""Credito"", c.debito as ""Debitado"", credito - debito as ""Total"" from creditos as c inner join indicado on (id_cliente_indicou = c.id_cliente) 
                                inner join cliente as cl using (id_cliente) where c.credito > 0 
                                AND (ID_CLIENTE = {0} OR -999 = {0}) AND (ID_CLINICA = {1} OR -999 = {1}) group by cl.nome, c.id_cliente, c.credito, c.debito order by credito desc", id_cliente, id_clinica);

                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            catch (Exception ex) { }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        internal DataTable getDebitos(int id_cliente, int id_clinica)
        {       
            DataTable dt = new DataTable();    
            try
            {
                dt = new DataTable();
                String sql = string.Format(@"
                            SELECT NOME AS ""Paciente"", 
                                   COALESCE(DEBITO,0 ) AS ""Pts Trocados"",
                                   CIDADE AS ""Cidade""
                            FROM CLIENTE 
	                            INNER JOIN CREDITOS USING(ID_CLIENTE) 
	                            INNER JOIN ENDERECO USING(ID_ENDERECO)
                            WHERE (ID_CLINICA = {0} OR -999 = {0})
                              AND (ID_CLIENTE = {1} OR -999 = {1})", id_clinica, id_cliente);
                    
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            catch (Exception ex) { }
            finally
            {
                conn.Close();
            }
            return dt;
            
        }
    }
}